package de.dis2011.data;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Date;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.*;

import javax.swing.text.StringContent;

import de.dis2011.data.DB2ConnectionManager;

/**
 * Vertrags-Bean
 */
public class Vertrag {
	private int 	id = -1;
	private int 	vertragsnummer;
	private String 	datum;
	private String 	ort;

	
	public int getId() {return id;}
	public void setId(int id) {	this.id = id;}
	
	public int getVertragsnummer() {return vertragsnummer;}
	public void setVertragsnummer(int vertragsnummer) {this.vertragsnummer = vertragsnummer;}
	
	public Date getDatum() {return StringToSQLDate(datum);}
	public void setDatum(String datum) {this.datum = datum;}
	
	public String getOrt() {return ort;}
	public void setOrt(String ort) {this.ort = ort;}

	
	/**
	 * L�dt einen Vertrag aus der Datenbank
	 * @param id ID des zu ladenden Vertrages
	 * @return Vertrags-Instanz
	 */
	public static Vertrag load(int id) {
		try {
			// Hole Verbindung
			Connection con = DB2ConnectionManager.getInstance().getConnection();

			// Erzeuge Anfrage
			String selectSQL = "SELECT * FROM vetrag WHERE id = ?";
			PreparedStatement pstmt = con.prepareStatement(selectSQL);
			pstmt.setInt(1, id);

			// F�hre Anfrage aus
			ResultSet rs = pstmt.executeQuery();
			if (rs.next()) {
				Vertrag ts = new Vertrag();
				ts.setId(rs.getInt("ID"));
				ts.setOrt(rs.getString("ort"));
				ts.setVertragsnummer(rs.getInt("vertragsnummer"));
				ts.setDatum(rs.getString("datum"));

				
				rs.close();
				pstmt.close();
				return ts;
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return null;
	}
	
	/**
	 * L�dt alle Vertr�ge aus der Datenbank
	 * @param id ID des zu ladenden Maklers
	 * @return alle Makler
	 */
	public static ArrayList<Vertrag> loadAll() {
		try {
			// Hole Verbindung
			Connection con = DB2ConnectionManager.getInstance().getConnection();

			// Erzeuge Anfrage
			String selectSQL = "SELECT * FROM vetrag";
			PreparedStatement pstmt = con.prepareStatement(selectSQL);

			// F�hre Anfrage aus
			ResultSet rs = pstmt.executeQuery();
			ArrayList<Vertrag> allVertrag = new ArrayList<Vertrag>();
			while (rs.next()) {
				Vertrag ts = new Vertrag();
				ts.setId(rs.getInt("id"));
				ts.setOrt(rs.getString("ort"));
				ts.setVertragsnummer(rs.getInt("vertragsnummer"));
				ts.setDatum(rs.getString("datum"));

				allVertrag.add(ts);
			}
			rs.close();
			pstmt.close();
			return allVertrag;
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return null;
	}
	
	/**
	 * Speichert den Makler in der Datenbank. Ist noch keine ID vergeben
	 * worden, wird die generierte Id von DB2 geholt und dem Model �bergeben.
	 */
	public void save() {
		// Hole Verbindung
		Connection con = DB2ConnectionManager.getInstance().getConnection();

		try {
			// FC<ge neues Element hinzu, wenn das Objekt noch keine ID hat.
			if (getId() == -1) {
				// Achtung, hier wird noch ein Parameter mitgegeben,
				// damit sp�ter generierte IDs zur�ckgeliefert werden!
				String insertSQL = "INSERT INTO vetrag(ort, vertragsnummer, datum) VALUES (?,?,?)";

				PreparedStatement pstmt = con.prepareStatement(insertSQL,
						Statement.RETURN_GENERATED_KEYS);

				// Setze Anfrageparameter und f�hre Anfrage aus
				pstmt.setString	(1, getOrt());
				pstmt.setInt	(2, getVertragsnummer());
				pstmt.setDate	(3, getDatum());
				
				pstmt.executeUpdate();

				// Hole die Id des engef�gten Datensatzes
				ResultSet rs = pstmt.getGeneratedKeys();
				if (rs.next()) {
					setId(rs.getInt(1));
				}

				rs.close();
				pstmt.close();
			} else {
				// Falls schon eine ID vorhanden ist, mache ein Update...
				String updateSQL = "UPDATE Vetrag SET ort = ?, vertragsnummer = ?, datum = ? WHERE id = ?";
				PreparedStatement pstmt = con.prepareStatement(updateSQL);

				// Setze Anfrage Parameter
				pstmt.setString	(1, getOrt());
				pstmt.setInt	(2, getVertragsnummer());
				pstmt.setDate	(3, StringToSQLDate(getDatum().toString()));;
				pstmt.setInt	(4, getId());
				pstmt.executeUpdate();

				pstmt.close();
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
	
	
	private static Date StringToSQLDate(String s) {
        Date sqlDate = null;
        SimpleDateFormat sdf;
        try {
        	sdf = new SimpleDateFormat("yyyy-MM-dd");
        	if (s!= null) {
        		
        		if (s.indexOf('.') > -1){
        			sdf = new SimpleDateFormat("dd.MM.yyyy");
        		}
        	           	
        		sqlDate = new Date(sdf.parse(s).getTime());
        	}
        	else{
        		sqlDate = new Date(sdf.parse("1990-01-01").getTime());
        	}	
        }
        catch (Exception e) {
            e.printStackTrace();
        }
        return sqlDate;
    }
	
	/**
	 * L�scht den Makler in der Datenbank.
	 * @param id des zu l�schenden Maklers
	 */
	public void delete(int id) {
		// Hole Verbindung
		Connection con = DB2ConnectionManager.getInstance().getConnection();

		try {
			if (id != -1) {
				String insertSQL = "Delete vetrag where id = ?";

				PreparedStatement pstmt = con.prepareStatement(insertSQL,
						Statement.RETURN_GENERATED_KEYS);

				// Setze Anfrageparameter und f�hre Anfrage aus
				pstmt.setInt(1, id);
				pstmt.executeUpdate();

				
				pstmt.close();
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
}
